package com.lzq.SingletonPattern;
/*
双检锁模式，饿汉式一开始就创建实例，会产生碎片，懒汉式不安全
 */
public class Singleton {
    //声明一个静态私有实例引用,volatile防止指令重排序，导致INSTANCE == null的情况
    private static volatile Singleton INSTANCE;
    //创建私有构造函数,防止被被人创建
    private Singleton(){

    }
    //创建获取实例方法
    public static Singleton getINSTANCE(){
        //防止实例已经并创建的情况下，还去抢锁，导致效率下降,在实例创建的情况下每个线程还去抢锁判断实例是否为空浪费性能
        if(INSTANCE == null){
            //加锁防止INSTANCE重复创建
            synchronized (Singleton.class){
                //如果没有创建，那么就创建
                if(INSTANCE == null){
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
